home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DTP / DTP_TEX / 3239.ZIP / DVIMTP.ZIP / OPTION.H < prev    next >
C/C++ Source or Header  |  1987-11-14  |  8KB  |  338 lines

  1. /* -*-C-*- option.h */
  2. /*-->option*/
  3. /**********************************************************************/
  4. /******************************* option *******************************/
  5. /**********************************************************************/
  6.  
  7. void
  8. option(optstr)            /* process command-line option */
  9. char *optstr;            /* option string (e.g. "-m1500") */
  10. {
  11.     register UNSIGN32 k;    /* magnification */
  12.     register int value;        /* converted digit string value */
  13.     register int m;        /* loop index */
  14.     char *p;            /* pointer into optstr */
  15.     int p1,p2,p3;        /* temp values for sscanf() */
  16.     double fltmag;        /* floating-point mag value */
  17.  
  18.     typedef struct
  19.     {
  20.     char* envname;
  21.     char* envvar;
  22.     } envstruct;
  23.  
  24.     static envstruct envlist[] =
  25.     {    /* names and addresses of environment vars (alphabetical order) */
  26.     "DVIHELP",    helpcmd,
  27.     "FONTLIST",    fontlist,
  28.     "TEXFONTS",    fontpath,
  29.     "TEXINPUTS",    subpath,
  30.     };
  31.  
  32.     if (*optstr != '-')
  33.     return;            /* return if this is not an option */
  34.  
  35.     switch (*(optstr+1))
  36.     {
  37.  
  38.     case 'a':    /* A selects virtual font caching */
  39.     case 'A':
  40.  
  41. #if    VIRTUAL_FONTS
  42.     virt_font = TRUE;
  43. #endif
  44.     break;
  45.  
  46.     case 'b':    /* b selects backwards printing order */
  47.     case 'B':
  48.     backwards = TRUE;
  49.     break;
  50.  
  51.  
  52.     case 'c':    /* c selects number of copies */
  53.     case 'C':
  54.     copies = (UNSIGN16) atoi(optstr+2);
  55.     copies = MAX(1,MIN(copies,256)); /* enforce reasonable limits */
  56.     break;
  57.  
  58.  
  59.     case 'd':    /* d selects debug output */
  60.     case 'D':
  61.     debug_code |= (BYTE)atoi(optstr+2);
  62.     break;
  63.  
  64.  
  65.     case 'e':    /* e specifies ``environment'' variable definition */
  66.     case 'E':    /* We ignore letter case since these come from */
  67.         /* the command line */
  68.     if (!(p = strrchr(optstr,'=')))
  69.     {
  70.         (void)usage(stderr);
  71.         (void)sprintf(message,
  72.             "option():  Bad switch [%s]--expected -eENVNAME=value",
  73.         optstr);
  74.         (void)fatal(message);
  75.     }
  76.     *p = '\0';        /* clobber "=" by string terminator */
  77.     for (m = 0; m < sizeof(envlist)/sizeof(envlist[0]); ++m)
  78.     {
  79.         if (strcm2(optstr+2,envlist[m].envname) == 0)
  80.         {
  81.         (void)strcpy(envlist[m].envvar,p+1);
  82.         return;
  83.         }
  84.     }
  85.     (void)usage(stderr);
  86.  
  87.     (void)sprintf(message,"option():  Bad switch [%s]--expected one of:",
  88.         optstr);
  89.     for (m = 0; m < sizeof(envlist)/sizeof(envlist[0]); ++m)
  90.     {
  91.         (void)strcat(message," ");
  92.         (void)strcat(message,envlist[m].envname);
  93.     }
  94.     (void)fatal(message);
  95.     break;
  96.  
  97.  
  98.     case 'f':    /* f specifies font substitution file */
  99.     case 'F':
  100.     (void)strcpy(subfile,optstr+2);
  101.     break;
  102.  
  103.  
  104. #if    CANON_A2
  105.  
  106. #ifdef CANON_TEST
  107.     case 'g':
  108.     case 'G':
  109.         stor_fonts = (UNSIGN32)atoi(optstr + 2 );
  110.         break;
  111. #endif /* CANON_TEST */
  112.  
  113. #endif
  114.  
  115.     case 'l':    /* l prohibits logging of errors */
  116.     case 'L':
  117.     g_dolog = FALSE;
  118.     break;
  119.  
  120.  
  121.     case 'm':    /* m selects alternate magnification */
  122.     case 'M':
  123.     /* Collect 2*value initially.  Then if value is small, assume
  124.     user specified magstep value; magstep k means 1.2**k, where k
  125.     is integral, or half-integral.  Otherwise, assume user has
  126.     specified pxl file magnification (1000 == 200dpi, 1500 ==
  127.     300dpi, etc.).  */
  128.  
  129.  
  130.     if (strchr(optstr+2,'.') != (char *)NULL)
  131.         fltmag = (double)(2.0 * atof(optstr+2));
  132.     else
  133.         fltmag = (double)(2 * atoi(optstr+2));
  134.     if ((0.0 != fltmag) && 
  135.         (-30.0 <= fltmag) && (fltmag <= 30.0)) /* magstep 15 is limit */
  136.     {
  137.         if (fltmag < 0.0)
  138.             runmag = (UNSIGN32)(0.5 + 
  139.             (1.0/pow((double)sqrt(1.2),-fltmag))*(double)STDMAG);
  140.         else
  141.             runmag = (UNSIGN32)(0.5 + pow((double)sqrt(1.2),fltmag)*
  142.                 (double)STDMAG);
  143.     }
  144.     else
  145.         runmag = (UNSIGN32)(0.5 + fltmag/2.0);
  146.  
  147.     k = MAGSIZE(actfact(runmag));  /* rounded magnification */
  148.     if (k != runmag)
  149.     {
  150.         (void)sprintf(message,
  151.         "option():  Requested magnification %d not available.",
  152.         (int)runmag);
  153.         (void)warning(message);
  154.         runmag = k;
  155.         k = (UNSIGN32) MAX(1,MIN(mag_index,(MAGTABSIZE-1)));
  156.         (void)sprintf(message,
  157.         "  Magnification reset to nearest legal value %d in \
  158. family ..%d..%d..%d..",
  159.         (int)runmag,(int)MAGSIZE(mag_table[k-1]),
  160.         (int)MAGSIZE(mag_table[k]),
  161.         (int)MAGSIZE(mag_table[k+1]));
  162.         (void)warning(message);
  163.     }
  164.     break;
  165.  
  166.  
  167.     case 'o':
  168.     case 'O':    /* o selects output page range (-o# or -o#:# or -o#:#:#) */
  169.         p1 = p2 = p3 = 0;
  170.     value = (int)sscanf(optstr+2,"%d:%d:%d",&p1,&p2,&p3);
  171.     page_begin[npage] = p1;
  172.     page_end[npage] = p2;
  173.     page_step[npage] = p3;
  174.     switch (value)
  175.     {
  176.     case 1:
  177.         optstr++;            /* point past "-" */
  178.  
  179.         do                /* skip over digit string */
  180.         {
  181.         optstr++;
  182.         }
  183.         while (isdigit(*optstr) || (*optstr == '-') || (*optstr == '+'));
  184.  
  185.         if (*optstr)        /* trash follows number */
  186.         {
  187.             (void)usage(stderr);
  188.         (void)sprintf(message,
  189.             "option():  %s is not a legal page number switch",optstr);
  190.         (void)fatal(message);
  191.         }
  192.         else            /* had expected end-of-string */
  193.             page_end[npage] = (INT16)page_begin[npage];
  194.         page_step[npage] = 1;
  195.         break;
  196.  
  197.     case 2:        /* supply default step */
  198.         page_step[npage] = 1;
  199.         /* FALL THROUGH to case 3 for order check */
  200.  
  201.     case 3:        /* check for positive step */
  202.         page_step[npage] = ABS(page_step[npage]);
  203.         if (page_step[npage] == 0)
  204.         page_step[npage] = 1;
  205.         break;
  206.  
  207.     default:    /* illegal value */
  208.         (void)usage(stderr);
  209.         (void)sprintf(message,
  210.         "option():  %s is not a legal page number switch",optstr);
  211.         (void)fatal(message);
  212.     }
  213.     npage++;
  214.     break;
  215.  
  216.  
  217.     case 'p':    /* p prohibits pre-font loading */
  218.     case 'P':
  219. #if    (HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2)
  220.     preload = TRUE;    /* preloading required for Canon engines */
  221.             /* because of reverse printing order */
  222. #else
  223.     preload = FALSE;
  224. #endif /*NOT(HPLASERJET|HPJETPLUS|GOLDENDAWNGL100|POSTSCRIPT|IMPRESS|CANON_A2)*/
  225.     break;
  226.  
  227.  
  228.     case 'q':    /* q inhibits status display */
  229.     case 'Q':
  230.     quiet = TRUE;
  231.     break;
  232.  
  233.  
  234. #if    HPLASERJET
  235.     case 'r':    /* r selects output resolution */
  236.     case 'R':
  237.     hpres = (INT16)atoi(optstr+2);
  238.     if ((hpres != 75) && (hpres != 100) && (hpres != 150) &&
  239.         (hpres != 300))
  240.         {
  241.         (void)sprintf(message,
  242.         "option():  Output resolution not in [75,100,150,300] dpi; \
  243. reset to %d",
  244.         DEFAULT_RESOLUTION);
  245.         (void)warning(message);
  246.         hpres = DEFAULT_RESOLUTION;
  247.         }
  248.     break;
  249. #endif /* HPLASERJET */
  250.  
  251.  
  252. #if    (APPLEIMAGEWRITER | EPSON | GOLDENDAWNGL100 | TOSHIBAP1351)
  253.     case 'r':    /* r selects run-length coding of output */
  254.     case 'R':
  255.     runlengthcode = TRUE;
  256.     break;
  257. #endif /* (APPLEIMAGEWRITER | EPSON | GOLDENDAWNGL100 | TOSHIBAP1351) */
  258.  
  259.  
  260. #if    CANON_A2
  261.  
  262. #ifdef CANON_TEST
  263.     case 's':    /* pixel size limit to force character reloading */
  264.     case 'S':
  265.     size_limit = (UNSIGN16)atoi(optstr+2);
  266.     break;
  267. #endif /* CANON_TEST */
  268.  
  269. #endif /* CANON_A2 */
  270.  
  271. #if    POSTSCRIPT
  272.     case 's':    /* pixel size limit to force character reloading */
  273.     case 'S':
  274.     size_limit = (UNSIGN16)atoi(optstr+2);
  275.     break;
  276. #endif
  277.  
  278. #if    EPSON
  279.     case 't':
  280.     case 'T':
  281.  
  282. #if    HIRES
  283.     twice_a_line = TRUE;
  284. #endif /* HIRES */
  285.  
  286.     break;
  287. #endif /* EPSON */
  288.  
  289.  
  290. #if    CANON_A2
  291.  
  292. #ifdef CANON_TEST
  293.     case 'u':
  294.     case 'U':
  295.     merit_fact = (UNSIGN16)atoi(optstr+2);
  296.     break;
  297.  
  298.     case 'v':
  299.     case 'V':
  300.     stor_limit = (UNSIGN32)atoi(optstr+2);
  301.     break;
  302. #endif /* CANON_TEST */
  303.  
  304. #endif /* CANON_A2 */
  305.  
  306. #if    POSTSCRIPT
  307.     case 'v':    /* vmbug -- reload fonts on each page */
  308.     case 'V':
  309.     ps_vmbug = TRUE;
  310.     break;
  311. #endif /* POSTSCRIPT */
  312.  
  313.  
  314.     case 'x':
  315.     case 'X':
  316.     leftmargin = inch(optstr+2);
  317.     break;
  318.  
  319.  
  320.     case 'y':
  321.     case 'Y':
  322.     topmargin = inch(optstr+2);
  323.     break;
  324.  
  325. #if    (OS_TOPS20 | BSD42)
  326.     case 'z':
  327.     case 'Z':
  328.     spool_output = TRUE;    /* offer to send output to spooler */
  329.     break;
  330. #endif /* (OS_TOPS20 | BSD42) */
  331.  
  332.     default:
  333.     (void)usage(stderr);
  334.     (void)sprintf(message,"option():  %s is not a legal switch", optstr);
  335.     (void)fatal(message);
  336.     }
  337. }
  338.